Prepare data

Read and format data

Prevalence

# reformat and merge prevalenc data
df_uk <- df_uk_covid %>% filter(time <=22) %>% 
  dplyr::rename(pers_o = open, 
         pers_c = sci,
         pers_e = extra,
         pers_a = agree,
         pers_n = neuro) %>%
  left_join(df_uk_popdens, by='ut_area') %>%
  select(-ut_name.y, -ut_name.x) %>%
  drop_na()

df_uk %>% head()
NA

Social distancing


# prepare popdens
df_uk_popdens_nuts <- df_uk_popdens_nuts %>%
  select(-nuts3_name)

# reformat and merge socdist data
df_uk_socdist <- df_uk_socdist %>% select(-runday) %>%
  filter(date >= '2020-03-09' & date <= '2020-03-31') %>%
  group_by(nuts3) %>% 
  mutate(time = row_number()) %>%
  ungroup() %>% 
  dplyr::rename(pers_o = open, 
                pers_c = sci,
                pers_e = extra,
                pers_a = agree,
                pers_n = neuro) %>% 
  left_join(df_uk_popdens_nuts, by='nuts3') %>%
  select(-nuts3_name) %>% 
  dplyr::rename(socdist_tiles = all_day_bing_tiles_visited_relat,
                socdist_single_tile = all_day_ratio_single_tile_users) %>%
  drop_na()
  
df_uk_socdist %>% head()
NA

Controls

Merge data

Identify London areas


nuts_london_inner <- c('UKI31','UKI32','UKI33','UKI34','UKI41',
                      'UKI42','UKI43','UKI44','UKI45')

nuts_london_outer <- c('UKI51','UKI52','UKI53','UKI54','UKI61',
                      'UKI62','UKI63','UKI71','UKI72','UKI73',
                      'UKI74','UKI75')

ut_london_inner <- c('E09000007','E09000001','E09000033','E09000013',
                    'E09000020','E09000032','E09000025','E09000012',
                    'E09000030','E09000014','E09000019','E09000023',
                    'E09000028','E09000022')

ut_london_outer <- c('E09000011','E09000004','E09000016','E09000002',
                    'E09000031','E09000026','E09000010','E09000006',
                    'E09000008','E09000029','E09000021','E09000024',
                    'E09000003','E09000005','E09000009','E09000017',
                    'E09000015','E09000018','E09000027')
df_uk_socdist = df_uk_socdist %>% 
  mutate(london = ifelse(nuts3 %in% nuts_london_inner, 'london_inner', 
                       ifelse(nuts3 %in% nuts_london_outer, 'london_outer',
                              'country')))

df_uk = df_uk %>% 
  mutate(london = ifelse(ut_area %in% ut_london_inner, 'london_inner', 
                       ifelse(ut_area %in% ut_london_outer, 'london_outer',
                              'country')))

df_uk
NA

Explore data

Plot prevalence over time


df_uk %>% ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=ut_area, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall prevalence over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_uk %>% mutate(prev_tail = cut(.[[i]], 
                                       breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
                                       labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=ut_area, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Plot social distancing over time


df_uk_socdist %>% ggplot(aes(x=time, y=socdist_tiles)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall prevalence over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_uk_socdist %>% mutate(socdist_tail = cut(.[[i]], 
                                       breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
                                       labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(socdist_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_tiles)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~socdist_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Explore differences between london and the rest

Correlations


df_uk %>% group_by(ut_area) %>% 
  summarize_if(is.numeric, mean, na.rm=T) %>% 
  select(-ut_area, -time) %>% 
  cor(use = 'pairwise.complete') %>% round(3)
         pers_o pers_e pers_a pers_n pers_c  frequ poptotal rate_day popdens
pers_o    1.000  0.734 -0.605 -0.144 -0.638  0.008   -0.097    0.646   0.801
pers_e    0.734  1.000 -0.413 -0.500 -0.294  0.065   -0.074    0.556   0.621
pers_a   -0.605 -0.413  1.000 -0.195  0.641  0.131    0.199   -0.585  -0.741
pers_n   -0.144 -0.500 -0.195  1.000 -0.351 -0.243   -0.124   -0.108   0.040
pers_c   -0.638 -0.294  0.641 -0.351  1.000  0.220    0.225   -0.489  -0.729
frequ     0.008  0.065  0.131 -0.243  0.220  1.000    0.949   -0.082  -0.195
poptotal -0.097 -0.074  0.199 -0.124  0.225  0.949    1.000   -0.128  -0.252
rate_day  0.646  0.556 -0.585 -0.108 -0.489 -0.082   -0.128    1.000   0.773
popdens   0.801  0.621 -0.741  0.040 -0.729 -0.195   -0.252    0.773   1.000
df_uk
NA

Modelling

Prepare functions


# function calculates all relevant models
run_models <- function(y, lvl1_x, lvl2_x, lvl2_id, data, ctrls=F){

  # subset data
  data = data %>% 
    dplyr::select(all_of(y), all_of(lvl1_x), all_of(lvl2_x), all_of(lvl2_id), 
                  popdens, all_of(y))
  data = data %>% 
    dplyr::rename(y = all_of(y),
           lvl1_x = all_of(lvl1_x),
           lvl2_x = all_of(lvl2_x),
           lvl2_id = all_of(lvl2_id)
           )
  
  # configure optimization procedure
  ctrl_config <- lmeControl(opt = 'optim', maxIter = 100, msMaxIter = 100)

  # baseline
  baseline <- lme(fixed = y ~ 1, random = ~ 1 | lvl2_id, 
                    data = data,
                    correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept fixed slope
  random_intercept <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                          random = ~ 1 | lvl2_id,
                            data = data,
                            correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept random slope
  random_slope <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                      random = ~ lvl1_x | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction <- lme(fixed = y ~ lvl1_x * lvl2_x, 
                     random = ~ lvl1_x | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction)
  
  
  if (ctrls == 'dem' | ctrls == 'prev'){
    
    # random intercept random slope
    random_slope_ctrl_dem <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens,
                              random = ~ lvl1_x | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_main_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_int_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')        
    
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem)
  }
  
  if (ctrls == 'prev'){
  
    # random intercept random slope
    random_slope_ctrl_prev <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens + rate_day,
                              random = ~ lvl1_x + rate_day | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')  
    
        # cross level interaction
    interaction_ctrl_main_prev <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens + rate_day,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
  
    # cross level interaction
    interaction_ctrl_int_prev<- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens + rate_day,
                             random = ~ lvl1_x + rate_day | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')
  
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem,                    
                    "random_slope_ctrl_prev" = random_slope_ctrl_prev,
                    "interaction_ctrl_main_prev" = interaction_ctrl_main_prev,
                    "interaction_ctrl_int_prev" = interaction_ctrl_int_prev)
  }
  
  if(ctrls == 'exp'){
    # random intercept random slope
  random_slope_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) + lvl2_x, 
                      random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) * lvl2_x, 
                     random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')  
  
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction,                  
                  "random_slope_exp" = random_slope_exp,
                  "interaction_exp" = interaction_exp)
  }
  
  return(results)
        
}

# extracts table with coefficients and tests statistics
extract_results <- function(models) {
  
  models_summary <- models %>% 
  map(summary) %>% 
  map("tTable") %>% 
  map(as.data.frame) %>% 
  map(round, 10) 
  # %>% map(~ .[str_detect(rownames(.), 'Inter|lvl'),])
  
  return(models_summary)
  
}


# calculates comparison of all models in model list
compare_models <- function(models) {

  mdl_names <- models %>% names()
  
  str = ''
  for (i in mdl_names){
    
    mdl_str <- paste('models$', i, sep = '')
    
    if(i == 'baseline'){
      str <- mdl_str
    }else{
    str <- paste(str, mdl_str, sep=', ')
    }
  }
  
  anova_str <- paste0('anova(', str, ')')
  mdl_comp <- eval(parse(text=anova_str))
  rownames(mdl_comp) = mdl_names
  return(mdl_comp)
}

Remove London Data

Rescale Data

lvl2_scaled_ut <- df_uk %>% 
  dplyr::select(-time, -frequ, -rate_day, -london) %>% 
  distinct() %>% 
  mutate_at(vars(-ut_area), scale)

lvl1_scaled_ut <- df_uk %>% select(ut_area, time, rate_day) %>% 
  mutate_at(vars(-ut_area, -time), scale)

df_uk_scaled <- plyr::join(lvl1_scaled_ut, lvl2_scaled_ut, by = 'ut_area')

head(df_uk_scaled)

df_uk_socdist
lvl2_scaled_nuts <- df_uk_socdist %>% 
  dplyr::select(-time, -date, -frequ, -london, 
                -socdist_tiles, -socdist_single_tile) %>% 
  distinct() %>% 
  mutate_at(vars(-nuts3), scale)

lvl1_scaled_nuts <- df_uk_socdist %>% select(nuts3, time, socdist_single_tile) %>% 
  mutate_at(vars(-nuts3, -time), scale)

df_uk_socdist_scaled <- plyr::join(lvl1_scaled_nuts, lvl2_scaled_nuts, by = 'nuts3')

head(df_uk_socdist_scaled)
NA

Predict prevalence

prevalence ~ openness


models_o_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_o_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_o_covid)
NA

prevalence ~ conscientiousness


models_c_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_c_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_c_covid)
NA
NA

prevalence ~ extraversion


models_e_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_e_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_e_covid)
NA
NA

prevalence ~ agreeableness


models_a_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_a_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_a_covid)
NA
NA

prevalence ~ neuroticism


models_n_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_n_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_n_covid)
NA
NA

Predict social distancing

social distancing ~ openness

df_uk_socdist_scaled

models_o_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_o_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_o_socdist)
NA

social distancing ~ conscientiousness


models_c_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_c_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_c_socdist)
NA
NA

social distancing ~ extraversion


models_e_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_e_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_e_socdist)
NA
NA

social distancing ~ agreeableness


models_a_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_a_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_a_socdist)
NA
NA

social distancing ~ neuroticism


models_n_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'dem')

extract_results(models_n_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_n_socdist)
NA
NA

prevalence ~ conscientiousness


models_c_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_c_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_c_covid_exp)
NA

prevalence ~ extraversion


models_e_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_e_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_e_covid_exp)
NA

prevalence ~ agreeableness


models_a_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_a_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_a_covid_exp)
NA

prevalence ~ neuroticism


models_n_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_n_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_n_covid_exp)
NA

Create overview table

Define function to create overview tables

Create overview tables

# prevalence
models_prev <- list(models_o_covid, 
                    models_c_covid, 
                    models_e_covid, 
                    models_a_covid, 
                    models_n_covid)

sum_tab_prev <- summary_table(models_prev, dv_name = 'prev')

write.table(sum_tab_prev, quote=F)
Value Std.Error DF t-value p-value
prev~o*time_crtl_popdens 0.0446 0.0025 3085 17.7883 0
prev~c*time_crtl_popdens -0.0385 0.0025 3085 -15.1323 0
prev~e*time_crtl_popdens 0.037 0.0026 3085 14.4632 0
prev~a*time_crtl_popdens -0.0424 0.0025 3085 -16.806 0
prev~n*time_crtl_popdens -0.0031 0.0026 3085 -1.1772 0.2392
prev~o*time_crtl_popdens*time -0.0018 0.004 3084 -0.4332 0.6649
prev~c*time_crtl_popdens*time 0.0057 0.0035 3084 1.6178 0.1058
prev~e*time_crtl_popdens*time 0.003 0.0031 3084 0.9744 0.33
prev~a*time_crtl_popdens*time -0.0012 0.0036 3084 -0.3446 0.7304
prev~n*time_crtl_popdens*time -0.0054 0.0024 3084 -2.2262 0.0261
# social distancing
models_socdist <- list(models_o_socdist, 
                       models_c_socdist, 
                       models_e_socdist, 
                       models_a_socdist, 
                       models_n_socdist)

sum_tab_socdist <- summary_table(models_socdist, dv_name = 'socdist')

write.table(sum_tab_socdist, quote=F)
Value Std.Error DF t-value p-value
socdist~o*time_crtl_popdens -0.003 0.0016 2858 -1.8795 0.0603
socdist~c*time_crtl_popdens 0.0025 0.0016 2858 1.566 0.1175
socdist~e*time_crtl_popdens -0.0034 0.0016 2858 -2.125 0.0337
socdist~a*time_crtl_popdens 0.0026 0.0016 2858 1.6029 0.1091
socdist~n*time_crtl_popdens 7e-04 0.0016 2858 0.4622 0.644
socdist~o*time_crtl_popdens*time 1e-04 0.0026 2857 0.0494 0.9606
socdist~c*time_crtl_popdens*time -7e-04 0.0024 2857 -0.3057 0.7599
socdist~e*time_crtl_popdens*time -0.0015 0.0021 2857 -0.7327 0.4638
socdist~a*time_crtl_popdens*time -6e-04 0.0024 2857 -0.2436 0.8076
socdist~n*time_crtl_popdens*time 8e-04 0.0016 2857 0.5063 0.6127

Conditional random forest analysis

Extract slopes prevalence

Extract slopes social distancing

Explore distribution of slopes

df_uk_slope_prev %>% ggplot(aes(slope_prev)) + geom_histogram(bins = 100)


df_uk_slope_socdist %>% ggplot(aes(slope_socdist)) + geom_histogram(bins = 100)

CRF prevalence ~ openness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_o_fit_prev <- cforest(slope_prev ~ pers_o + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_o_varimp_prev <- varimp(crf_o_fit_prev, nperm = 1)
crf_o_varimp_cond_prev <- varimp(crf_o_fit_prev, conditional = T, nperm = 1)

crf_o_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_o_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ conscientiousness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_c_fit_prev <- cforest(slope_prev ~ pers_c + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_c_varimp_prev <- varimp(crf_c_fit_prev, nperm = 1)
crf_c_varimp_cond_prev <- varimp(crf_c_fit_prev, conditional = T, nperm = 1)

crf_c_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_c_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ extraversion


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_e_fit_prev <- cforest(slope_prev ~ pers_e + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_e_varimp_prev <- varimp(crf_e_fit_prev, nperm = 1)
crf_e_varimp_cond_prev <- varimp(crf_e_fit_prev, conditional = T, nperm = 1)

crf_e_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_e_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ agreeableness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_a_fit_prev <- cforest(slope_prev ~ pers_a + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_a_varimp_prev <- varimp(crf_a_fit_prev, nperm = 1)
crf_a_varimp_cond_prev <- varimp(crf_a_fit_prev, conditional = T, nperm = 1)

crf_a_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_a_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ neuroticism


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_n_fit_prev <- cforest(slope_prev ~ pers_n + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_n_varimp_prev <- varimp(crf_n_fit_prev, nperm = 1)
crf_n_varimp_cond_prev <- varimp(crf_n_fit_prev, conditional = T, nperm = 1)

crf_n_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_n_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ openness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_o_fit_socdist <- cforest(slope_socdist ~ pers_o + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_o_varimp_socdist <- varimp(crf_o_fit_socdist, nperm = 5)
crf_o_varimp_cond_socdist <- varimp(crf_o_fit_socdist, conditional = T, nperm = 5)

crf_o_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_o_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ conscientiousness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_c_fit_socdist <- cforest(slope_socdist ~ pers_c + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_c_varimp_socdist <- varimp(crf_c_fit_socdist, nperm = 5)
crf_c_varimp_cond_socdist <- varimp(crf_c_fit_socdist, conditional = T, nperm = 5)

crf_c_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_c_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ extraversion


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_e_fit_socdist <- cforest(slope_socdist ~ pers_e + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_e_varimp_socdist <- varimp(crf_e_fit_socdist, nperm = 5)
crf_e_varimp_cond_socdist <- varimp(crf_e_fit_socdist, conditional = T, nperm = 5)

crf_e_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_e_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ agreeableness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_a_fit_socdist <- cforest(slope_socdist ~ pers_a + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_a_varimp_socdist <- varimp(crf_a_fit_socdist, nperm = 5)
crf_a_varimp_cond_socdist <- varimp(crf_a_fit_socdist, conditional = T, nperm = 5)

crf_a_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_a_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ neuroticism


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_n_fit_socdist <- cforest(slope_socdist ~ pers_n + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_n_varimp_socdist <- varimp(crf_n_fit_socdist, nperm = 5)
crf_n_varimp_cond_socdist <- varimp(crf_n_fit_socdist, conditional = T, nperm = 5)

crf_n_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_n_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))
LS0tCnRpdGxlOiAiQ09WSUQxOSBVSyIKYXV0aG9yOiAiSGVpbnJpY2ggUGV0ZXJzIgpkYXRlOiAiNC8yMy8yMDIwIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCiMgTUFDCiBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGF0YS9VSycpCiAKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShubG1lKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHh0YWJsZSkKCmBgYAoKIyBQcmVwYXJlIGRhdGEKCiMjIyBSZWFkIGFuZCBmb3JtYXQgZGF0YQoKIyMjIFByZXZhbGVuY2UgCmBgYHtyfQoKZGZfdWtfY292aWQgPC0gcmVhZF9jc3YoJ3RpbWVzZXJpZXNfdWtfdXRsYV9tYXJjaDlfYXByaWxfMDkuY3N2JykKCmRmX3VrIDwtIGRmX3VrX2NvdmlkICU+JSBmaWx0ZXIodGltZSA8PTIyKSAlPiUgCiAgZHBseXI6OnJlbmFtZShwZXJzX28gPSBvcGVuLCAKICAgICAgICAgcGVyc19jID0gc2NpLAogICAgICAgICBwZXJzX2UgPSBleHRyYSwKICAgICAgICAgcGVyc19hID0gYWdyZWUsCiAgICAgICAgIHBlcnNfbiA9IG5ldXJvKSAlPiUKICBzZWxlY3QoLXV0X25hbWUsIC1hcmVhbmFtZSwgLXBvcHRvdGFsKSAlPiUKICBkcm9wX25hKCkKCmRmX3VrICU+JSBoZWFkKCkKCmBgYAoKIyMjIFNvY2lhbCBkaXN0YW5jaW5nCmBgYHtyfQoKZGZfdWtfc29jZGlzdCA8LSByZWFkX2NzdignVUtfc29jZGlzdF9mYl9udXRzMy5jc3YnKQoKZGZfdWtfc29jZGlzdCA8LSBkZl91a19zb2NkaXN0ICU+JSBzZWxlY3QoLXJ1bmRheSkgJT4lCiAgZmlsdGVyKGRhdGUgPj0gJzIwMjAtMDMtMDknICYgZGF0ZSA8PSAnMjAyMC0wMy0zMScpICU+JQogIGdyb3VwX2J5KG51dHMzKSAlPiUgCiAgbXV0YXRlKHRpbWUgPSByb3dfbnVtYmVyKCkpICU+JQogIHVuZ3JvdXAoKSAlPiUgCiAgZHBseXI6OnJlbmFtZShwZXJzX28gPSBvcGVuLCAKICAgICAgICAgICAgICAgIHBlcnNfYyA9IHNjaSwKICAgICAgICAgICAgICAgIHBlcnNfZSA9IGV4dHJhLAogICAgICAgICAgICAgICAgcGVyc19hID0gYWdyZWUsCiAgICAgICAgICAgICAgICBwZXJzX24gPSBuZXVybykgJT4lIAogIHNlbGVjdCgtbnV0czNfbmFtZSkgJT4lIAogIGRwbHlyOjpyZW5hbWUoc29jZGlzdF90aWxlcyA9IGFsbF9kYXlfYmluZ190aWxlc192aXNpdGVkX3JlbGF0LAogICAgICAgICAgICAgICAgc29jZGlzdF9zaW5nbGVfdGlsZSA9IGFsbF9kYXlfcmF0aW9fc2luZ2xlX3RpbGVfdXNlcnMpICU+JQogIGRyb3BfbmEoKQogIApkZl91a19zb2NkaXN0ICU+JSBoZWFkKCkKCmBgYAoKIyMjIENvbnRyb2xzIApgYGB7cn0KZGZfdWtfY3RybF9udXRzIDwtIHJlYWRfY3N2KCJjb250cm9sc19VS19udXRzMy5jc3YiKQpkZl91a19jdHJsX251dHMgPC0gZGZfdWtfY3RybF9udXRzICU+JSBzZWxlY3QoLW51dHMzX25hbWUpCmRmX3VrX2N0cmxfbnV0cwoKZGZfdWtfY3RybF91dCA8LSByZWFkX2NzdigiY29udHJvbHNfVUtfdXQuY3N2IikKZGZfdWtfY3RybF91dCA8LSBkZl91a19jdHJsX3V0ICU+JSBzZWxlY3QoLXV0X25hbWUpCmRmX3VrX2N0cmxfdXQKCgpgYGAKCiMjIyBNZXJnZSBkYXRhIApgYGB7cn0KCmRmX3VrIDwtIGRmX3VrICU+JSBwbHlyOjpqb2luKGRmX3VrX2N0cmxfdXQsIGJ5PSd1dF9hcmVhJykKCmRmX3VrX3NvY2Rpc3QgPC0gZGZfdWtfc29jZGlzdCAlPiUgcGx5cjo6am9pbihkZl91a19jdHJsX251dHMsIGJ5PSdudXRzMycpCgoKYGBgCgoKIyMjIElkZW50aWZ5IExvbmRvbiBhcmVhcwpgYGB7cn0KCm51dHNfbG9uZG9uX2lubmVyIDwtIGMoJ1VLSTMxJywnVUtJMzInLCdVS0kzMycsJ1VLSTM0JywnVUtJNDEnLAogICAgICAgICAgICAgICAgICAgICAgJ1VLSTQyJywnVUtJNDMnLCdVS0k0NCcsJ1VLSTQ1JykKCm51dHNfbG9uZG9uX291dGVyIDwtIGMoJ1VLSTUxJywnVUtJNTInLCdVS0k1MycsJ1VLSTU0JywnVUtJNjEnLAogICAgICAgICAgICAgICAgICAgICAgJ1VLSTYyJywnVUtJNjMnLCdVS0k3MScsJ1VLSTcyJywnVUtJNzMnLAogICAgICAgICAgICAgICAgICAgICAgJ1VLSTc0JywnVUtJNzUnKQoKdXRfbG9uZG9uX2lubmVyIDwtIGMoJ0UwOTAwMDAwNycsJ0UwOTAwMDAwMScsJ0UwOTAwMDAzMycsJ0UwOTAwMDAxMycsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAyMCcsJ0UwOTAwMDAzMicsJ0UwOTAwMDAyNScsJ0UwOTAwMDAxMicsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAzMCcsJ0UwOTAwMDAxNCcsJ0UwOTAwMDAxOScsJ0UwOTAwMDAyMycsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAyOCcsJ0UwOTAwMDAyMicpCgp1dF9sb25kb25fb3V0ZXIgPC0gYygnRTA5MDAwMDExJywnRTA5MDAwMDA0JywnRTA5MDAwMDE2JywnRTA5MDAwMDAyJywKICAgICAgICAgICAgICAgICAgICAnRTA5MDAwMDMxJywnRTA5MDAwMDI2JywnRTA5MDAwMDEwJywnRTA5MDAwMDA2JywKICAgICAgICAgICAgICAgICAgICAnRTA5MDAwMDA4JywnRTA5MDAwMDI5JywnRTA5MDAwMDIxJywnRTA5MDAwMDI0JywKICAgICAgICAgICAgICAgICAgICAnRTA5MDAwMDAzJywnRTA5MDAwMDA1JywnRTA5MDAwMDA5JywnRTA5MDAwMDE3JywKICAgICAgICAgICAgICAgICAgICAnRTA5MDAwMDE1JywnRTA5MDAwMDE4JywnRTA5MDAwMDI3JykKYGBgCgpgYGB7cn0KCmRmX3VrID0gZGZfdWsgJT4lIAogIG11dGF0ZShsb25kb24gPSBpZmVsc2UodXRfYXJlYSAlaW4lIHV0X2xvbmRvbl9pbm5lciwgJ2xvbmRvbl9pbm5lcicsIAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1dF9hcmVhICVpbiUgdXRfbG9uZG9uX291dGVyLCAnbG9uZG9uX291dGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvdW50cnknKSkpICU+JQogIG11dGF0ZShsb25kb24gPSBhcy5mYWN0b3IobG9uZG9uKSkKCmRmX3VrX3NvY2Rpc3QgPSBkZl91a19zb2NkaXN0ICU+JSAKICBtdXRhdGUobG9uZG9uID0gaWZlbHNlKG51dHMzICVpbiUgbnV0c19sb25kb25faW5uZXIsICdsb25kb25faW5uZXInLCAKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobnV0czMgJWluJSBudXRzX2xvbmRvbl9vdXRlciwgJ2xvbmRvbl9vdXRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3VudHJ5JykpKSAlPiUKICBtdXRhdGUobG9uZG9uID0gYXMuZmFjdG9yKGxvbmRvbikpCgpgYGAKCgojIEV4cGxvcmUgZGF0YQoKIyMjIFBsb3QgcHJldmFsZW5jZSBvdmVyIHRpbWUKYGBge3J9CgpkZl91ayAlPiUgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD11dF9hcmVhLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJPdmVyYWxsIHByZXZhbGVuY2Ugb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl91ayAlPiUgbXV0YXRlKHByZXZfdGFpbCA9IGN1dCguW1tpXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC1JbmYsIHF1YW50aWxlKC5bW2ldXSwgMC4yKSwgcXVhbnRpbGUoLltbaV1dLCAwLjgpLCBJbmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdsb3dlciB0YWlsJywgJ2NlbnRlcicsICd1cHBlciB0YWlsJykpKSAlPiUgCiAgZmlsdGVyKHByZXZfdGFpbCAhPSAnY2VudGVyJykgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD11dF9hcmVhLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIGZhY2V0X3dyYXAofnByZXZfdGFpbCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZShpKQoKcHJpbnQoZ2cpCn0KCmBgYAoKCiMjIyBQbG90IHNvY2lhbCBkaXN0YW5jaW5nIG92ZXIgdGltZQpgYGB7cn0KCmRmX3VrX3NvY2Rpc3QgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1udXRzMywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBzb2NpYWwgZGlzdGFuY2luZyBvdmVyIHRpbWUiKQoKcGVycyA8LSBjKCdwZXJzX28nLCAncGVyc19jJywgJ3BlcnNfZScsICdwZXJzX2EnLCAncGVyc19uJykKCmZvciAoaSBpbiBwZXJzKXsKCmdnIDwtIGRmX3VrX3NvY2Rpc3QgJT4lIG11dGF0ZShzb2NkaXN0X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMiksIHF1YW50aWxlKC5bW2ldXSwgMC44KSwgSW5mKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihzb2NkaXN0X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1udXRzMywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5zb2NkaXN0X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CgpgYGAKCiMjIyBFeHBsb3JlIGRpZmZlcmVuY2VzIGJldHdlZW4gbG9uZG9uIGFuZCB0aGUgcmVzdCAKYGBge3J9CgpkZl91ayAlPiUgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD11dF9hcmVhLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBmYWNldF93cmFwKH5sb25kb24pICsKICBnZ3RpdGxlKCJPdmVyYWxsIHByZXZhbGVuY2Ugb3ZlciB0aW1lIikKCgoKYGBgCgoKYGBge3J9CmRmX3VrX3NvY2Rpc3QgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1udXRzMywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZmFjZXRfd3JhcCh+bG9uZG9uKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBzb2NpYWwgZGlzdGFuY2luZyBvdmVyIHRpbWUiKQpgYGAKCgojIyMgQ29ycmVsYXRpb25zCmBgYHtyfQoKZGZfdWsgJT4lIGdyb3VwX2J5KHV0X2FyZWEpICU+JSAKICBzdW1tYXJpemVfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm09VCkgJT4lIAogIHNlbGVjdCgtdXRfYXJlYSwgLXRpbWUpICU+JSAKICBjb3IodXNlID0gJ3BhaXJ3aXNlLmNvbXBsZXRlJykgJT4lIHJvdW5kKDMpCgpkZl91a19zb2NkaXN0ICU+JSBncm91cF9ieShudXRzMykgJT4lIAogIHN1bW1hcml6ZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybT1UKSAlPiUgCiAgc2VsZWN0KC1udXRzMywgLXRpbWUpICU+JSAKICBjb3IodXNlID0gJ3BhaXJ3aXNlLmNvbXBsZXRlJykgJT4lIHJvdW5kKDMpCgpgYGAKCiMgTW9kZWxsaW5nIAojIyBQcmVwYXJlIGZ1bmN0aW9ucwoKYGBge3J9CgojIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYWxsIHJlbGV2YW50IG1vZGVscwpydW5fbW9kZWxzIDwtIGZ1bmN0aW9uKHksIGx2bDFfeCwgbHZsMl94LCBsdmwyX2lkLCBkYXRhLCBjdHJscz1GKXsKCiAgIyBzdWJzZXQgZGF0YQogIGRhdGEgPSBkYXRhICU+JSAKICAgIGRwbHlyOjpzZWxlY3QoYWxsX29mKHkpLCBhbGxfb2YobHZsMV94KSwgYWxsX29mKGx2bDJfeCksIGFsbF9vZihsdmwyX2lkKSwgCiAgICAgICAgICAgICAgICAgIHBvcGRlbnMsIGFsbF9vZih5KSkKICBkYXRhID0gZGF0YSAlPiUgCiAgICBkcGx5cjo6cmVuYW1lKHkgPSBhbGxfb2YoeSksCiAgICAgICAgICAgbHZsMV94ID0gYWxsX29mKGx2bDFfeCksCiAgICAgICAgICAgbHZsMl94ID0gYWxsX29mKGx2bDJfeCksCiAgICAgICAgICAgbHZsMl9pZCA9IGFsbF9vZihsdmwyX2lkKQogICAgICAgICAgICkKICAKICAjIGNvbmZpZ3VyZSBvcHRpbWl6YXRpb24gcHJvY2VkdXJlCiAgY3RybF9jb25maWcgPC0gbG1lQ29udHJvbChvcHQgPSAnb3B0aW0nLCBtYXhJdGVyID0gMTAwLCBtc01heEl0ZXIgPSAxMDApCgogICMgYmFzZWxpbmUKICBiYXNlbGluZSA8LSBsbWUoZml4ZWQgPSB5IH4gMSwgcmFuZG9tID0gfiAxIHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQoKICAjIHJhbmRvbSBpbnRlcmNlcHQgZml4ZWQgc2xvcGUKICByYW5kb21faW50ZXJjZXB0IDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gMSB8IGx2bDJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKCiAgIyByYW5kb20gaW50ZXJjZXB0IHJhbmRvbSBzbG9wZQogIHJhbmRvbV9zbG9wZSA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICsgbHZsMl94LCAKICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCgogICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICBpbnRlcmFjdGlvbiA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94LCAKICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgIyBjcmVhdGUgbGlzdCB3aXRoIHJlc3VsdHMKICByZXN1bHRzIDwtIGxpc3QoJ2Jhc2VsaW5lJyA9IGJhc2VsaW5lLCAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9pbnRlcmNlcHQiID0gcmFuZG9tX2ludGVyY2VwdCwgCiAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGUiID0gcmFuZG9tX3Nsb3BlLAogICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb24iID0gaW50ZXJhY3Rpb24pCiAgCiAgCiAgaWYgKGN0cmxzID09ICdkZW0nIHwgY3RybHMgPT0gJ3ByZXYnKXsKICAgIAogICAgIyByYW5kb20gaW50ZXJjZXB0IHJhbmRvbSBzbG9wZQogICAgcmFuZG9tX3Nsb3BlX2N0cmxfZGVtIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3ggKyBwb3BkZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQogIAogICAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogICAgaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbSA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94ICsgcG9wZGVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAgICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICAgIGludGVyYWN0aW9uX2N0cmxfaW50X2RlbSA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94ICsgbHZsMV94ICogcG9wZGVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykgICAgICAgIAogICAgCiAgICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogICAgcmVzdWx0cyA8LSBsaXN0KCdiYXNlbGluZScgPSBiYXNlbGluZSwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9pbnRlcmNlcHQiID0gcmFuZG9tX2ludGVyY2VwdCwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uIiA9IGludGVyYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGVfY3RybF9kZW0iID0gcmFuZG9tX3Nsb3BlX2N0cmxfZGVtLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtIiA9IGludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0sCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfaW50X2RlbSIgPSBpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW0pCiAgfQogIAogIGlmIChjdHJscyA9PSAncHJldicpewogIAogICAgIyByYW5kb20gaW50ZXJjZXB0IHJhbmRvbSBzbG9wZQogICAgcmFuZG9tX3Nsb3BlX2N0cmxfcHJldiA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICsgbHZsMl94ICsgcG9wZGVucyArIHJhdGVfZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCArIHJhdGVfZGF5IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpICAKICAgIAogICAgICAgICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICAgIGludGVyYWN0aW9uX2N0cmxfbWFpbl9wcmV2IDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3ggKyBwb3BkZW5zICsgcmF0ZV9kYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgCiAgICAjIGNyb3NzIGxldmVsIGludGVyYWN0aW9uCiAgICBpbnRlcmFjdGlvbl9jdHJsX2ludF9wcmV2PC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCAqIGx2bDJfeCArIGx2bDFfeCAqIHBvcGRlbnMgKyByYXRlX2RheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCArIHJhdGVfZGF5IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQogIAogICAgIyBjcmVhdGUgbGlzdCB3aXRoIHJlc3VsdHMKICAgIHJlc3VsdHMgPC0gbGlzdCgnYmFzZWxpbmUnID0gYmFzZWxpbmUsIAogICAgICAgICAgICAgICAgICAgICJyYW5kb21faW50ZXJjZXB0IiA9IHJhbmRvbV9pbnRlcmNlcHQsIAogICAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGUiID0gcmFuZG9tX3Nsb3BlLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbiIgPSBpbnRlcmFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlX2N0cmxfZGVtIiA9IHJhbmRvbV9zbG9wZV9jdHJsX2RlbSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbSIgPSBpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW0iID0gaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtLCAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZV9jdHJsX3ByZXYiID0gcmFuZG9tX3Nsb3BlX2N0cmxfcHJldiwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9tYWluX3ByZXYiID0gaW50ZXJhY3Rpb25fY3RybF9tYWluX3ByZXYsCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfaW50X3ByZXYiID0gaW50ZXJhY3Rpb25fY3RybF9pbnRfcHJldikKICB9CiAgCiAgaWYoY3RybHMgPT0gJ2V4cCcpewogICAgIyByYW5kb20gaW50ZXJjZXB0IHJhbmRvbSBzbG9wZQogIHJhbmRvbV9zbG9wZV9leHAgPC0gbG1lKGZpeGVkID0geSB+IChsdmwxX3ggKyBJKGx2bDFfeF4yKSkgKyBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAobHZsMV94ICsgSShsdmwxX3heMikpIHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCgogICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICBpbnRlcmFjdGlvbl9leHAgPC0gbG1lKGZpeGVkID0geSB+IChsdmwxX3ggKyBJKGx2bDFfeF4yKSkgKiBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IChsdmwxX3ggKyBJKGx2bDFfeF4yKSkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpICAKICAKICAKICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogIHJlc3VsdHMgPC0gbGlzdCgnYmFzZWxpbmUnID0gYmFzZWxpbmUsIAogICAgICAgICAgICAgICAgICAicmFuZG9tX2ludGVyY2VwdCIgPSByYW5kb21faW50ZXJjZXB0LCAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbiIgPSBpbnRlcmFjdGlvbiwgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZV9leHAiID0gcmFuZG9tX3Nsb3BlX2V4cCwKICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2V4cCIgPSBpbnRlcmFjdGlvbl9leHApCiAgfQogIAogIHJldHVybihyZXN1bHRzKQogICAgICAgIAp9CgojIGV4dHJhY3RzIHRhYmxlIHdpdGggY29lZmZpY2llbnRzIGFuZCB0ZXN0cyBzdGF0aXN0aWNzCmV4dHJhY3RfcmVzdWx0cyA8LSBmdW5jdGlvbihtb2RlbHMpIHsKICAKICBtb2RlbHNfc3VtbWFyeSA8LSBtb2RlbHMgJT4lIAogIG1hcChzdW1tYXJ5KSAlPiUgCiAgbWFwKCJ0VGFibGUiKSAlPiUgCiAgbWFwKGFzLmRhdGEuZnJhbWUpICU+JSAKICBtYXAocm91bmQsIDEwKSAKICAjICU+JSBtYXAofiAuW3N0cl9kZXRlY3Qocm93bmFtZXMoLiksICdJbnRlcnxsdmwnKSxdKQogIAogIHJldHVybihtb2RlbHNfc3VtbWFyeSkKICAKfQoKCiMgY2FsY3VsYXRlcyBjb21wYXJpc29uIG9mIGFsbCBtb2RlbHMgaW4gbW9kZWwgbGlzdApjb21wYXJlX21vZGVscyA8LSBmdW5jdGlvbihtb2RlbHMpIHsKCiAgbWRsX25hbWVzIDwtIG1vZGVscyAlPiUgbmFtZXMoKQogIAogIHN0ciA9ICcnCiAgZm9yIChpIGluIG1kbF9uYW1lcyl7CiAgICAKICAgIG1kbF9zdHIgPC0gcGFzdGUoJ21vZGVscyQnLCBpLCBzZXAgPSAnJykKICAgIAogICAgaWYoaSA9PSAnYmFzZWxpbmUnKXsKICAgICAgc3RyIDwtIG1kbF9zdHIKICAgIH1lbHNlewogICAgc3RyIDwtIHBhc3RlKHN0ciwgbWRsX3N0ciwgc2VwPScsICcpCiAgICB9CiAgfQogIAogIGFub3ZhX3N0ciA8LSBwYXN0ZTAoJ2Fub3ZhKCcsIHN0ciwgJyknKQogIG1kbF9jb21wIDwtIGV2YWwocGFyc2UodGV4dD1hbm92YV9zdHIpKQogIHJvd25hbWVzKG1kbF9jb21wKSA9IG1kbF9uYW1lcwogIHJldHVybihtZGxfY29tcCkKfQoKCmBgYAoKIyMgUmVtb3ZlIExvbmRvbiBEYXRhIApgYGB7cn0KIyBkZl91ayA8LSBkZl91ayAlPiUgZmlsdGVyKGxvbmRvbiA9PSAnY291bnRyeScpCiMgZGZfdWtfc29jZGlzdCA8LSBkZl91a19zb2NkaXN0ICU+JSBmaWx0ZXIobG9uZG9uID09ICdjb3VudHJ5JykKCmBgYAoKCgojIyBSZXNjYWxlIERhdGEKYGBge3J9Cmx2bDJfc2NhbGVkX3V0IDwtIGRmX3VrICU+JSAKICBkcGx5cjo6c2VsZWN0KC10aW1lLCAtZnJlcXUsIC1yYXRlX2RheSwgLWxvbmRvbikgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC11dF9hcmVhKSwgc2NhbGUpCgpsdmwxX3NjYWxlZF91dCA8LSBkZl91ayAlPiUgc2VsZWN0KHV0X2FyZWEsIHRpbWUsIHJhdGVfZGF5KSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLXV0X2FyZWEsIC10aW1lKSwgc2NhbGUpCgpkZl91a19zY2FsZWQgPC0gcGx5cjo6am9pbihsdmwxX3NjYWxlZF91dCwgbHZsMl9zY2FsZWRfdXQsIGJ5ID0gJ3V0X2FyZWEnKQoKaGVhZChkZl91a19zY2FsZWQpCmBgYAoKCmBgYHtyfQoKZGZfdWtfc29jZGlzdApsdmwyX3NjYWxlZF9udXRzIDwtIGRmX3VrX3NvY2Rpc3QgJT4lIAogIGRwbHlyOjpzZWxlY3QoLXRpbWUsIC1kYXRlLCAtZnJlcXUsIC1sb25kb24sIAogICAgICAgICAgICAgICAgLXNvY2Rpc3RfdGlsZXMsIC1zb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLW51dHMzKSwgc2NhbGUpCgpsdmwxX3NjYWxlZF9udXRzIDwtIGRmX3VrX3NvY2Rpc3QgJT4lIHNlbGVjdChudXRzMywgdGltZSwgc29jZGlzdF9zaW5nbGVfdGlsZSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1udXRzMywgLXRpbWUpLCBzY2FsZSkKCmRmX3VrX3NvY2Rpc3Rfc2NhbGVkIDwtIHBseXI6OmpvaW4obHZsMV9zY2FsZWRfbnV0cywgbHZsMl9zY2FsZWRfbnV0cywgYnkgPSAnbnV0czMnKQoKaGVhZChkZl91a19zb2NkaXN0X3NjYWxlZCkKCmBgYAoKCgojIyBQcmVkaWN0IHByZXZhbGVuY2UKIyMjIHByZXZhbGVuY2UgfiBvcGVubmVzcwpgYGB7cn0KCm1vZGVsc19vX2NvdmlkIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfb19jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19vX2NvdmlkKQoKYGBgCgojIyMgcHJldmFsZW5jZSB+IGNvbnNjaWVudGlvdXNuZXNzCmBgYHtyfQoKbW9kZWxzX2NfY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19jJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ3V0X2FyZWEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19jX2NvdmlkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2NfY292aWQpCgoKYGBgCgojIyMgcHJldmFsZW5jZSB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCm1vZGVsc19lX2NvdmlkIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfZV9jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19lX2NvdmlkKQoKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKbW9kZWxzX2FfY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19hJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ3V0X2FyZWEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19hX2NvdmlkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2FfY292aWQpCgoKYGBgCgojIyMgcHJldmFsZW5jZSB+IG5ldXJvdGljaXNtCmBgYHtyfQoKbW9kZWxzX25fY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19uJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ3V0X2FyZWEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19uX2NvdmlkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX25fY292aWQpCgoKYGBgCgoKIyMgUHJlZGljdCBzb2NpYWwgZGlzdGFuY2luZwojIyMgc29jaWFsIGRpc3RhbmNpbmcgfiBvcGVubmVzcwpgYGB7cn0KZGZfdWtfc29jZGlzdF9zY2FsZWQKCm1vZGVsc19vX3NvY2Rpc3QgPC1ydW5fbW9kZWxzKHkgPSAnc29jZGlzdF9zaW5nbGVfdGlsZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX28nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAnbnV0czMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zb2NkaXN0X3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX29fc29jZGlzdCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19vX3NvY2Rpc3QpCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IGNvbnNjaWVudGlvdXNuZXNzCmBgYHtyfQoKbW9kZWxzX2Nfc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdudXRzMycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NvY2Rpc3Rfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfY19zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2Nfc29jZGlzdCkKCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCm1vZGVsc19lX3NvY2Rpc3QgPC1ydW5fbW9kZWxzKHkgPSAnc29jZGlzdF9zaW5nbGVfdGlsZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2UnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAnbnV0czMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zb2NkaXN0X3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2Vfc29jZGlzdCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19lX3NvY2Rpc3QpCgoKYGBgCgojIyMgc29jaWFsIGRpc3RhbmNpbmcgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKbW9kZWxzX2Ffc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdudXRzMycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NvY2Rpc3Rfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfYV9zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2Ffc29jZGlzdCkKCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IG5ldXJvdGljaXNtCmBgYHtyfQoKbW9kZWxzX25fc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdudXRzMycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NvY2Rpc3Rfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfbl9zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX25fc29jZGlzdCkKCgpgYGAKCgojIyBFeHBsb3JlIHF1YWRyYXRpYyB0cmVuZHMgCgojIyMgcHJldmFsZW5jZSB+IG9wZW5uZXNzCmBgYHtyfQoKbW9kZWxzX29fY292aWRfZXhwIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX28nLAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdleHAnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19vX2NvdmlkX2V4cCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19vX2NvdmlkX2V4cCkKCmBgYAoKCiMjIHByZXZhbGVuY2UgfiBjb25zY2llbnRpb3VzbmVzcwpgYGB7cn0KCm1vZGVsc19jX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2MnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2NfY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2NfY292aWRfZXhwKQoKYGBgCgojIyMgcHJldmFsZW5jZSB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCm1vZGVsc19lX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2UnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2VfY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2VfY292aWRfZXhwKQoKYGBgCgojIyMgcHJldmFsZW5jZSB+IGFncmVlYWJsZW5lc3MKYGBge3J9Cgptb2RlbHNfYV9jb3ZpZF9leHAgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19hJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ3V0X2FyZWEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdleHAnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19hX2NvdmlkX2V4cCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19hX2NvdmlkX2V4cCkKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBuZXVyb3RpY2lzbQpgYGB7cn0KCm1vZGVsc19uX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX24nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX25fY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX25fY292aWRfZXhwKQoKYGBgCgojIyBDcmVhdGUgb3ZlcnZpZXcgdGFibGUgCgojIyMgRGVmaW5lIGZ1bmN0aW9uIHRvIGNyZWF0ZSBvdmVydmlldyB0YWJsZXMKYGBge3J9CgpzdW1tYXJ5X3RhYmxlIDwtIGZ1bmN0aW9uKG1vZGVscywgZHZfbmFtZSl7CgogIHRlbXBfZGZfY3RybF9tYWluIDwtIE5VTEwKICB0ZW1wX2RmX2N0cmxfaW50IDwtIE5VTEwKICAKICBmb3IgKGkgaW4gbW9kZWxzKXsKICAgIHJlc3VsdHMgPC0gaSAlPiUgZXh0cmFjdF9yZXN1bHRzKCkKICAgIAogICAgcmVzdWx0c19jdHJsX21haW4gPC0gcmVzdWx0cyRpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtWydsdmwxX3g6bHZsMl94JyxdCiAgICB0ZW1wX2RmX2N0cmxfbWFpbiA8LSB0ZW1wX2RmX2N0cmxfbWFpbiAlPiUgcmJpbmQocmVzdWx0c19jdHJsX21haW4pCiAgICAKICAgIHJlc3VsdHNfY3RybF9pbnQgPC0gcmVzdWx0cyRpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW1bJ2x2bDFfeDpsdmwyX3gnLF0KICAgIHRlbXBfZGZfY3RybF9pbnQgPC0gdGVtcF9kZl9jdHJsX2ludCAlPiUgcmJpbmQocmVzdWx0c19jdHJsX2ludCkKICB9CiAgCiAgbmFtZXNfY3RybF9tYWluIDwtIHBhc3RlMChkdl9uYW1lLCAnficsIGMoJ28nLCAnYycsICdlJywgJ2EnLCAnbicpLCAnKnRpbWUnLCAnX2NydGxfcG9wZGVucycpCiAgbmFtZXNfY3RybF9pbnQgPC0gcGFzdGUwKGR2X25hbWUsICd+JywgYygnbycsICdjJywgJ2UnLCAnYScsICduJyksICcqdGltZScsICdfY3J0bF9wb3BkZW5zKnRpbWUnKQoKICByb3duYW1lcyh0ZW1wX2RmX2N0cmxfbWFpbikgPC0gbmFtZXNfY3RybF9tYWluCiAgcm93bmFtZXModGVtcF9kZl9jdHJsX2ludCkgPC0gbmFtZXNfY3RybF9pbnQKICAKICBzdW1fdGFiIDwtIHJiaW5kKHRlbXBfZGZfY3RybF9tYWluLCB0ZW1wX2RmX2N0cmxfaW50KSAlPiUgcm91bmQoNCkKICAKICByZXR1cm4oc3VtX3RhYikKCn0gCgpgYGAKCiMjIyBDcmVhdGUgb3ZlcnZpZXcgdGFibGVzCmBgYHtyfQojIHByZXZhbGVuY2UKbW9kZWxzX3ByZXYgPC0gbGlzdChtb2RlbHNfb19jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX2NfY292aWQsIAogICAgICAgICAgICAgICAgICAgIG1vZGVsc19lX2NvdmlkLCAKICAgICAgICAgICAgICAgICAgICBtb2RlbHNfYV9jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX25fY292aWQpCgpzdW1fdGFiX3ByZXYgPC0gc3VtbWFyeV90YWJsZShtb2RlbHNfcHJldiwgZHZfbmFtZSA9ICdwcmV2JykKCndyaXRlLnRhYmxlKHN1bV90YWJfcHJldiwgcXVvdGU9RikKCiMgc29jaWFsIGRpc3RhbmNpbmcKbW9kZWxzX3NvY2Rpc3QgPC0gbGlzdChtb2RlbHNfb19zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfY19zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfZV9zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfYV9zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfbl9zb2NkaXN0KQoKc3VtX3RhYl9zb2NkaXN0IDwtIHN1bW1hcnlfdGFibGUobW9kZWxzX3NvY2Rpc3QsIGR2X25hbWUgPSAnc29jZGlzdCcpCgp3cml0ZS50YWJsZShzdW1fdGFiX3NvY2Rpc3QsIHF1b3RlPUYpCgoKCmBgYAoKCgoKCiMgQ29uZGl0aW9uYWwgcmFuZG9tIGZvcmVzdCBhbmFseXNpcyAKCiMjIyBFeHRyYWN0IHNsb3BlcyBwcmV2YWxlbmNlCmBgYHtyfQoKIyBzbG9wZSBwcmV2YWxlbmNlCmRmX3VrX3Nsb3BlX3ByZXYgPC0gZGZfdWsgJT4lIHNwbGl0KC4kdXRfYXJlYSkgJT4lIAogIG1hcCh+IGxtKHJhdGVfZGF5IH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAoY29lZikgJT4lIAogIG1hcF9kYmwoJ3RpbWUnKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ3V0X2FyZWEnKSAlPiUgCiAgcmVuYW1lKHNsb3BlX3ByZXYgPSAnLicpCgojIG1lcmdlIHdpdGggY29udHJvbCB2YXJpYWJsZXMgCmRmX3VrX3Nsb3BlX3ByZXYgPC0gZGZfdWsgJT4lIHNlbGVjdCgtdGltZSwgLXJhdGVfZGF5KSAlPiUKICBkaXN0aW5jdCgpICU+JSAKICBpbm5lcl9qb2luKGRmX3VrX3Nsb3BlX3ByZXYsIGJ5ID0gJ3V0X2FyZWEnKQoKaGVhZChkZl91a19zbG9wZV9wcmV2KQoKYGBgCgoKIyMjIEV4dHJhY3Qgc2xvcGVzIHNvY2lhbCBkaXN0YW5jaW5nCmBgYHtyfQoKIyBzbG9wZSBzb2NkaXN0CmRmX3VrX3Nsb3BlX3NvY2Rpc3QgPC0gZGZfdWtfc29jZGlzdCAlPiUgc3BsaXQoLiRudXRzMykgJT4lCiAgbWFwKH4gbG0oc29jZGlzdF9zaW5nbGVfdGlsZSB+IHRpbWUsIGRhdGEgPSAuKSkgJT4lCiAgbWFwKGNvZWYpICU+JQogIG1hcF9kYmwoJ3RpbWUnKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCdudXRzMycpICU+JQogIHJlbmFtZShzbG9wZV9zb2NkaXN0ID0gJy4nKQoKIyBtZXJnZSB3aXRoIGNvbnRyb2wgdmFyaWFibGVzIApkZl91a19zbG9wZV9zb2NkaXN0IDwtIGRmX3VrX3NvY2Rpc3QgJT4lIHNlbGVjdCgtdGltZSwgLWRhdGUsIC1zb2NkaXN0X3RpbGVzLCAtc29jZGlzdF9zaW5nbGVfdGlsZSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBpbm5lcl9qb2luKGRmX3VrX3Nsb3BlX3NvY2Rpc3QsIGJ5ID0gJ251dHMzJykKCmhlYWQoZGZfdWtfc2xvcGVfc29jZGlzdCkKCmBgYAoKIyMjIEV4cGxvcmUgZGlzdHJpYnV0aW9uIG9mIHNsb3BlcwpgYGB7cn0KZGZfdWtfc2xvcGVfcHJldiAlPiUgZ2dwbG90KGFlcyhzbG9wZV9wcmV2KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKQoKZGZfdWtfc2xvcGVfc29jZGlzdCAlPiUgZ2dwbG90KGFlcyhzbG9wZV9zb2NkaXN0KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKQoKYGBgCgoKCiMgQ1JGIHByZXZhbGVuY2UgfiBvcGVubmVzcwpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfb19maXRfcHJldiA8LSBjZm9yZXN0KHNsb3BlX3ByZXYgfiBwZXJzX28gKyB3b21lbiArIGFjYWRlbWljcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zcGl0YWxfYmVkcyArIGdkcCArIG1hbnVmYWN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0ICsgYWdlICsgcG9wZGVucywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9nZXJfc2xvcGVfcHJldlstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9vX3ZhcmltcF9wcmV2IDwtIHZhcmltcChjcmZfb19maXRfcHJldiwgbnBlcm0gPSAxKQpjcmZfb192YXJpbXBfY29uZF9wcmV2IDwtIHZhcmltcChjcmZfb19maXRfcHJldiwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfb192YXJpbXBfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfb192YXJpbXBfY29uZF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIENSRiBwcmV2YWxlbmNlIH4gY29uc2NpZW50aW91c25lc3MKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX2NfZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19jICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGNkdSArIGFmZCArIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3ByZXZbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfY192YXJpbXBfcHJldiA8LSB2YXJpbXAoY3JmX2NfZml0X3ByZXYsIG5wZXJtID0gMSkKY3JmX2NfdmFyaW1wX2NvbmRfcHJldiA8LSB2YXJpbXAoY3JmX2NfZml0X3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX2NfdmFyaW1wX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX2NfdmFyaW1wX2NvbmRfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgojIENSRiBwcmV2YWxlbmNlIH4gZXh0cmF2ZXJzaW9uCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9lX2ZpdF9wcmV2IDwtIGNmb3Jlc3Qoc2xvcGVfcHJldiB+IHBlcnNfZSArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBjZHUgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9wcmV2Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX2VfdmFyaW1wX3ByZXYgPC0gdmFyaW1wKGNyZl9lX2ZpdF9wcmV2LCBucGVybSA9IDEpCmNyZl9lX3ZhcmltcF9jb25kX3ByZXYgPC0gdmFyaW1wKGNyZl9lX2ZpdF9wcmV2LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9lX3ZhcmltcF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9lX3ZhcmltcF9jb25kX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgoKIyBDUkYgcHJldmFsZW5jZSB+IGFncmVlYWJsZW5lc3MKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX2FfZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19hICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGNkdSArIGFmZCArIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3ByZXZbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfYV92YXJpbXBfcHJldiA8LSB2YXJpbXAoY3JmX2FfZml0X3ByZXYsIG5wZXJtID0gMSkKY3JmX2FfdmFyaW1wX2NvbmRfcHJldiA8LSB2YXJpbXAoY3JmX2FfZml0X3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX2FfdmFyaW1wX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX2FfdmFyaW1wX2NvbmRfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgojIENSRiBwcmV2YWxlbmNlIH4gbmV1cm90aWNpc20KYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX25fZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19uICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGNkdSArIGFmZCArIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3ByZXZbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfbl92YXJpbXBfcHJldiA8LSB2YXJpbXAoY3JmX25fZml0X3ByZXYsIG5wZXJtID0gMSkKY3JmX25fdmFyaW1wX2NvbmRfcHJldiA8LSB2YXJpbXAoY3JmX25fZml0X3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX25fdmFyaW1wX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX25fdmFyaW1wX2NvbmRfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgojIENSRiBzb2NpYWwgZGlzdGFuY2luZyB+IG9wZW5uZXNzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9vX2ZpdF9zb2NkaXN0IDwtIGNmb3Jlc3Qoc2xvcGVfc29jZGlzdCB+IHBlcnNfbyArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBjZHUgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9zb2NkaXN0Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX29fdmFyaW1wX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9vX2ZpdF9zb2NkaXN0LCBucGVybSA9IDUpCmNyZl9vX3ZhcmltcF9jb25kX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9vX2ZpdF9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gNSkKCmNyZl9vX3ZhcmltcF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9vX3ZhcmltcF9jb25kX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIENSRiBzb2NpYWwgZGlzdGFuY2luZyB+IGNvbnNjaWVudGlvdXNuZXNzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9jX2ZpdF9zb2NkaXN0IDwtIGNmb3Jlc3Qoc2xvcGVfc29jZGlzdCB+IHBlcnNfYyArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBjZHUgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9zb2NkaXN0Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX2NfdmFyaW1wX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9jX2ZpdF9zb2NkaXN0LCBucGVybSA9IDUpCmNyZl9jX3ZhcmltcF9jb25kX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9jX2ZpdF9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gNSkKCmNyZl9jX3ZhcmltcF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9jX3ZhcmltcF9jb25kX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIENSRiBzb2NpYWwgZGlzdGFuY2luZyB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfZV9maXRfc29jZGlzdCA8LSBjZm9yZXN0KHNsb3BlX3NvY2Rpc3QgfiBwZXJzX2UgKyB3b21lbiArIGFjYWRlbWljcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2R1ICsgYWZkICsgaG9zcGl0YWxfYmVkcyArIGdkcCArIG1hbnVmYWN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0ICsgYWdlICsgcG9wZGVucywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9nZXJfc2xvcGVfc29jZGlzdFstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9lX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfZV9maXRfc29jZGlzdCwgbnBlcm0gPSA1KQpjcmZfZV92YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfZV9maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDUpCgpjcmZfZV92YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfZV92YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyBDUkYgc29jaWFsIGRpc3RhbmNpbmcgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9hX2ZpdF9zb2NkaXN0IDwtIGNmb3Jlc3Qoc2xvcGVfc29jZGlzdCB+IHBlcnNfYSArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBjZHUgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9zb2NkaXN0Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX2FfdmFyaW1wX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9hX2ZpdF9zb2NkaXN0LCBucGVybSA9IDUpCmNyZl9hX3ZhcmltcF9jb25kX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9hX2ZpdF9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gNSkKCmNyZl9hX3ZhcmltcF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9hX3ZhcmltcF9jb25kX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgoKIyBDUkYgc29jaWFsIGRpc3RhbmNpbmcgfiBuZXVyb3RpY2lzbQpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfbl9maXRfc29jZGlzdCA8LSBjZm9yZXN0KHNsb3BlX3NvY2Rpc3QgfiBwZXJzX24gKyB3b21lbiArIGFjYWRlbWljcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2R1ICsgYWZkICsgaG9zcGl0YWxfYmVkcyArIGdkcCArIG1hbnVmYWN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0ICsgYWdlICsgcG9wZGVucywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9nZXJfc2xvcGVfc29jZGlzdFstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9uX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfbl9maXRfc29jZGlzdCwgbnBlcm0gPSA1KQpjcmZfbl92YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfbl9maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDUpCgpjcmZfbl92YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfbl92YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAo=